<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // console.log(1 + "2" + "2"); //122
        //console.log(1++"2"+"2");
        // console.log(1 + -"1" + "2"); //02
        // console.log(+"1" + "2" + "2"); //122
        // console.log("A" - "B" + "2"); //NaN2
        // console.log("A" - "B" + 2); //NaN

        // 以上代码将输出到控制台:
        //     "122"
        // "32"
        // "112"
        // "NaN2"
        // NaN
        // 这是为什么...
        //     这里的基本问题是JavaScript(ECMAScript) 是一种松散类型的语
        // 言， 它对值执行自动类型转换以适应正在执行的操作。 让我们来看看
        // 这是如何与上面的每个例子进行比较。
        // 示例1: 1 + “2” + “2” 输出: “122” 说明: 第一个操作在1 + “2” 中执行。 由于其中 - -个操作数(“2”) 是 - 一个字符串， 所以
        // JavaScript假定需要执行字符串连接， 因此将1的类型转换为“ 1”，
        // 1 + “2” 转换为“ 12”。 然后，“ 12” + “2” 产生“ 122”。
        // 示例2: 1 + +“2” + “2” 输出: “32” 说明: 根据操作顺序， 要执.
        // 行的第一个操作是 + “2”(第一 - 个“ 2” 之前的额外 + 被视为一 - 个 - -元 运算符)。 因此， JavaScript将“ 2” 的类型转换为数字， 然后将一
        // 元 + 符号应用于它(即将其视为正数)。 结果， 下一 - 个操作现在是1 + ,
        //     2， 当然这会产生3.但是， 我们有一个数字和一个字符串之间的操作(即3和“ 2”)， 所以JavaScript再次转换数值赋给一一个字符串并执
        // 行字符串连接， 产生“ 32”.。
        // 示例3: 1 + -“1” + “2” 输出: “02” 说明: 这里的解释与前面的
        // 示例相同， 只是 - -元运算符是 - 而不是 + 。因此，“ 1” 变为1， 然后
        // 在应用
        // 时将其变为 - 1， 然后将其加1到产生0， 然后转换为字符串
        // 并与最终的“ 2” 操作数连接， 产生“ 02”。
        // 示例4: +“1” + “1” + “2” 输出: “112” 说明: 尽管第一个“ 1” 操作数是基于其前面的一元 + 运算符的数值类型转换的， 当它与
        // 第二个“ 1” 操作数连接在一起时返回一个字符串， 然后与最终的“ 2” 操作数连接， 产生字符串“ 112”。
        // 示例5: “A” 一“ B” + “2” 输出: “NaN2” 说明: 由于 - 运算符
        // 不能应用于字符串， 并且既不能将“ A " 也不能将“B” 转换为数值,“ - ”B“ 产生NaN, 然后与字符串” 2“ 串联产生” NaN2“。
        // 例6: “A” - “B” + 2 输出: NaN说明: 在前面的例子中，“ A” - “B” 产生NaN。 但是任何运算符应用于NaN和其他数字操作数仍然
        // 会产生NaN。
    </script>
</body>

</html>